package com.dudy.abstractFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * author:zjw20
 * date:2016/9/13
 * email:zjw2023@163.com
 * description: pizza商店工厂的测试类
 * 工厂方法模式：所有创建哪种对象由子类决定，父类一般为abstract
 */
public class PizzaTest {
    public static void main(String[] args) {
        /**
         * 选择pizza商店
         * 订购pizza类型
         */
        PizzaStore pizzaStore = new PizzaStoreFactory();
        Pizza pizza = pizzaStore.orderPizza("Chinese");
        System.out.println("订购的pizza名称是："+pizza.getName());
    }
}
/**
 * pizza商店
 */
abstract class PizzaStore{
    /**
     * 订单
     * @param type pizza类型
     * @return
     */
    public Pizza orderPizza(String type){
        Pizza pizza = createPizza(type);
        pizza.prepare();
        pizza.cute();
        return pizza;
    }

    /**
     * 生产pizza的工厂类
     * @param type
     * @return
     */
    abstract Pizza createPizza(String type);
}

/**
 * pizzaStore工厂类，根据不同的类型生产不同的pizza
 * 每个pizzaStore可以自定义属于自己的pizza工厂
 */
class PizzaStoreFactory extends PizzaStore{
    @Override
    Pizza createPizza(String type) {
        if(type == null || type == ""){
            throw new RuntimeException("pizza type不能为空");
        }else if(type.equals("Chinese")){
            return new ChinesePizza();
        }else if(type.equals("America")){
            return new AmericaPizza();
        }else{
            return null;
        }
    }
}
abstract class Pizza{
    String name;
    List<String> toppings = new ArrayList<String>();//pizza的配料
    void prepare(){
        System.out.println("要准备的pizza名称是："+name);
        toppings.forEach((String topping)->{
            System.out.println("要准备的pizza配料有："+topping);
        });
    }
    void cute(){
        System.out.println("切成普通大小");
    }
    String getName(){
        return name;
    }
}
/**
 * America pizza
 */
class AmericaPizza extends Pizza{
    public AmericaPizza(){
        name = "America pizza";
        toppings.add("add a cheese");
    }
}

/**
 * chinese pizza
 */
class ChinesePizza extends Pizza{
    public ChinesePizza(){
        name = "中国pizza";
        toppings.add("添加番茄酱配料");
    }
    void cute(){
        System.out.println("请切成4块");
    }
}
